package com.example.demo.service;

import com.example.demo.exception.AccessDeniedException;
import com.example.demo.exception.ResourceNotFoundException;
import com.example.demo.model.entity.achievement.ResearchPaper;
import com.example.demo.model.entity.audit.AuditRecord;
import com.example.demo.model.entity.user.User;
import com.example.demo.model.enums.AuditResult;
import com.example.demo.model.enums.PaperStatusEnum;
import com.example.demo.model.enums.UserStatus;
import com.example.demo.model.enums.UserTypeEnum;
import com.example.demo.model.vo.StudentPaperVO;
import com.example.demo.model.vo.StudentUpdateVO;
import com.github.pagehelper.PageInfo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

public interface TeacherManageService {

        // ==================== 学生管理 ====================
        /**
         * 获取当前教师关联的学生列表
         * @return 学生实体列表
         * @throws ResourceNotFoundException 当前用户不存在时抛出
         */
        @Transactional(readOnly = true)
        List<User> getRelatedStudents(Long teacherId);

        /**
         * 更新学生基本信息
         * @param studentId 学生ID
         * @param updateVO 更新数据
         * @throws AccessDeniedException 无权限修改时抛出
         * @throws ResourceNotFoundException 学生不存在时抛出
         */
        @Transactional
        void updateStudentInfo(Long studentId, StudentUpdateVO updateVO);

        /**
         * 解除与学生的关联关系
         * @param studentId 学生ID
         * @throws AccessDeniedException 无权限操作时抛出
         * @throws ResourceNotFoundException 学生不存在时抛出
         * @throws IllegalStateException 学生有待审核论文时抛出
         */
        @Transactional
        void removeStudentRelation(Long studentId);

        // ==================== 论文管理 ====================
        /**
         * 分页获取学生论文列表
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @return 分页论文VO列表
         */
        @Transactional(readOnly = true)
        PageInfo<StudentPaperVO> getStudentPapers(Long teacherId, int pageNum, int pageSize);

        /**
         * 审核学生论文
         * @param paperId 论文ID
         * @param result 审核结果
         * @param comment 审核意见
         * @throws ResourceNotFoundException 论文不存在时抛出
         * @throws AccessDeniedException 无权限审核时抛出
         */
        @Transactional
        void auditPaper(Long paperId, Long teacherId, AuditResult result, String comment);

        /**
         * 获取论文详情
         * @param paperId 论文ID
         * @return 论文实体
         * @throws ResourceNotFoundException 论文不存在时抛出
         */
        @Transactional(readOnly = true)
        ResearchPaper getPaperDetail(Long paperId);

        /**
         * 搜索学生论文
         * @param studentId 学生ID（可选）
         * @param keyword 搜索关键词
         * @param status 论文状态（可选）
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @return 分页论文列表
         */
        @Transactional(readOnly = true)
        PageInfo<ResearchPaper> searchStudentPapers(Long studentId, String keyword,
                                                    PaperStatusEnum status, int pageNum, int pageSize);

        // ==================== 审核记录 ====================
        /**
         * 分页获取审核记录
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @return 分页审核记录
         */
        @Transactional(readOnly = true)
        PageInfo<AuditRecord> getAuditRecords(int pageNum, int pageSize);

        /**
         * 分页获取审核记录，带结果筛选
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @param result 审核结果筛选条件（可选）
         * @return 分页审核记录
         */
        @Transactional(readOnly = true)
        PageInfo<AuditRecord> getAuditRecords(int pageNum, int pageSize, AuditResult result);

        // ==================== 辅助方法 ====================
        /**
         * 检查学生是否有待审核的论文
         * @param studentId 学生ID
         * @return true/false
         */
        @Transactional(readOnly = true)
        boolean hasPendingAudits(Long studentId);

        // ==================== 工具方法（默认实现）====================
        /**
         * 转换审核结果为论文状态（默认实现）
         */
        default PaperStatusEnum convertAuditResultToStatus(AuditResult result) {
                Objects.requireNonNull(result, "审核结果不能为空");
                switch (result) {
                        case APPROVED: return PaperStatusEnum.APPROVED;
                        case REJECTED: return PaperStatusEnum.REJECTED;
                        default: return PaperStatusEnum.SUBMITTED;
                }
        }
}